<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>

    // 闭包 
    // 函数在执行过程中返回了另一个函数,另一个函数中引用了父作用域的变量 => 导致父作用域一直得不到释放
    // 闭包是指    有权访问另一个函数作用域中的变量    的函数。
    // 简单的来说  就是 一个函数在执行过程中 返回另一个函数/对象 (引用类型   一般都是函数)

    // 如何形成闭包?
    // 1. 在函数内容部,返回一个引用类型(数组,对象,函数,以函数为主)
    // 2. 返回的引用类型(数组,对象,函数,以函数为主),使用函数中的局部作用域变量
    // 3. 在函数的外部,有变量来引用 引用类型

    // 优缺点
    // 优点: 
    // 可以在函数外部访问函数内部的值, 减少全局变量的使用

    // 缺点:
    // 可以在函数外部访问函数内部的值 => 不安全,又暴露的风险
    // 作用域一直被引用 => 得不到释放 => 栈内存 => 如果使用频率比较高 => 内存泄露

    function fn() {
        // debugger;
        var a = 10; // 11 12
        return {
            getA: function () {
                return a;
            },
            setA: function (val) {
                a = val;
            }
        }
    }

    var obj = fn(); // newFn 本质上引用函数 func
    console.log(obj);

    var result = obj.getA();
    console.log(result);

    obj.setA(100);

    var result = obj.getA();
    console.log(result);

    var o = fn();







</script>

</html>